package com.report.reportserver.utils;

import com.report.reportserver.model.Student;
import com.report.reportserver.model.Teacher;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.relational.core.sql.In;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * @ ClassName: ExcelUtil
 * @ Description：解析Excel的工具类
 * @ Modified By：
 * @ Version:
 * @ Author     ：LiYing
 * @ Date       ：Created in 10:47 2022/4/14
 */

public class ExcelUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class);

    /*
     * 通过输入的Excel的文件批量返回Student对象
     * @param inputStream
     * @return java.util.List<com.report.reportserver.model.Student>
     * @author LiYing
     * @creed: Talk is cheap,show me the code
     * @date 2022/4/14 10:50
     */
    public static List<Student> excelToStudent(InputStream inputStream) {
        List<Student> list = new ArrayList<>();
        Workbook workbook = null;
        try {
            //根据传递过来的文件输入流创建一个workbook对象（对应Excel中的工作簿）
            workbook = WorkbookFactory.create(inputStream);
            //创建完成，关闭输入流
            inputStream.close();

            //获取工作表对象，即第一个工作表 （工作簿里面有很多张工作表，这里取第一张工作表）
            Sheet sheet = workbook.getSheetAt(0);
            //获取工作表的总行数
            int rowLength = sheet.getLastRowNum() + 1;
            //获取第一行数据
            Row row = sheet.getRow(0);
            //工作表一共有多少列
            int colLength = row.getLastCellNum();

            //创建单元格对象
            Cell cell = null;

            //双重循环 因为一个单元格由行和列的索引下表构成
            for (int i = 1; i < rowLength - 1; i++) {//每一行就是一个学生对象
                Student student = new Student();
                for (int j = 0; j < colLength; j++) {
                    //分别取出第 a行 b列的单元格数据
                    cell = sheet.getRow(i).getCell(j);
                    //设置单元格的类型是String类型, 获取单元格的数据
                    DataFormatter dataFormatter = new DataFormatter();
                    String stringCellValue = dataFormatter.formatCellValue(cell);

                    if (stringCellValue == null || stringCellValue.equals("")) {
                        student = null;
                        break;
                    }

                    //通过列来进行判断要赋值的属性
                    switch (j) {
                        case 0:
                            student.setId(Integer.parseInt(stringCellValue));
                            break;
                        case 1:
                            student.setName(stringCellValue);
                            break;
                        case 2:
                            student.setMajor(stringCellValue);
                            break;
                        case 3:
                            student.setGender(stringCellValue);
                            break;
                        case 4:
                            student.setAcademy(stringCellValue);
                            break;
                        case 5:
                            student.setBirthday(stringCellValue);
                            break;
                        case 6:
                            student.setNumber(stringCellValue);
                            break;
                        case 7:
                            student.setGrade(Integer.parseInt(stringCellValue));
                            break;
                        case 8:
                            student.setPhone(stringCellValue);
                            break;
                        case 9:
                            student.setDormitory(Integer.parseInt(stringCellValue));
                            break;
                        case 10:
                            student.setType(stringCellValue);
                            break;
                    }
                }
                if (student != null) list.add(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("parse excel file error :", e);
        }
        return list;
    }


    /*
     * 通过输入的Excel的文件批量返回Teacher对象
     * @param inputStream
     * @return java.util.List<com.report.reportserver.model.Teacher>
     * @author LiYing
     * @creed: Talk is cheap,show me the code
     * @date 2022/4/14 19:07
     */
    public static List<Teacher> excelToTeacher(InputStream inputStream) {
        List<Teacher> list = new ArrayList<>();
        Workbook workbook = null;
        try {
            //根据传递过来的文件输入流创建一个workbook对象（对应Excel中的工作簿）
            workbook = WorkbookFactory.create(inputStream);
            //创建完成，关闭输入流
            inputStream.close();

            //获取工作表对象，即第一个工作表 （工作簿里面有很多张工作表，这里取第一张工作表）
            Sheet sheet = workbook.getSheetAt(0);
            //获取工作表的总行数
            int rowLength = sheet.getLastRowNum() + 1;
            //获取第一行数据
            Row row = sheet.getRow(0);
            //工作表一共有多少列
            int colLength = row.getLastCellNum();

            //创建单元格对象
            Cell cell = null;

            //时间对象
            SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd");

            //双重循环 因为一个单元格由行和列的索引下表构成
            for (int i = 1; i < rowLength - 1; i++) {//每一行就是一个学生对象
                Teacher teacher = new Teacher();
                for (int j = 0; j < colLength; j++) {
                    //分别取出第 a行 b列的单元格数据
                    cell = sheet.getRow(i).getCell(j);
                    //设置单元格的类型是String类型, 获取单元格的数据
                    DataFormatter dataFormatter = new DataFormatter();
                    String stringCellValue = dataFormatter.formatCellValue(cell);

                    if (stringCellValue == null || stringCellValue.equals("")) {
                        teacher = null;
                        break;
                    }

                    //通过列来进行判断要赋值的属性
                    switch (j) {
                        case 0:
                            teacher.setId(Integer.parseInt(stringCellValue));
                            break;
                        case 1:
                            teacher.setName(stringCellValue);
                            break;
                        case 2:
                            teacher.setNumber(stringCellValue);
                            break;
                        case 3:
                            teacher.setTitle(stringCellValue);
                            break;
                        case 4:
                            teacher.setGender(stringCellValue);
                            break;
                        case 5:
                            teacher.setEmployer(stringCellValue);
                            break;
                        case 6:
                            teacher.setBirthday(simpleFormat.parse(stringCellValue));
                            break;
                        case 7:
                            teacher.setEducation(stringCellValue);
                            break;
                        case 8:
                            teacher.setMajor(stringCellValue);
                            break;
                    }
                }
                if (teacher != null) list.add(teacher);
            }
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("parse excel file error :", e);
        }
        return list;
    }

    /*
     * 根据输入的excel文件来返回列名集合
     * @param inputStream
     * @return void
     * @author LiYing
     * @creed: Talk is cheap,show me the code
     * @date 2022/4/15 15:15
     */
    public static List<String> excelToTable(InputStream inputStream) {
        Workbook workbook = null;
        List<String> list = new ArrayList<>();
        try {
            //根据传递过来的文件输入流创建一个workbook对象（对应Excel中的工作簿）
            workbook = WorkbookFactory.create(inputStream);
            //创建完成，关闭输入流
            inputStream.close();

            //获取工作表对象，即第一个工作表 （工作簿里面有很多张工作表，这里取第一张工作表）
            Sheet sheet = workbook.getSheetAt(0);
            //获取工作表的总行数
            int rowLength = sheet.getLastRowNum() + 1;
            //获取第一行数据
            Row row = sheet.getRow(0);
            //工作表一共有多少列
            int colLength = row.getLastCellNum();
            //创建单元格对象
            Cell cell = null;

            for (int i = 0; i < colLength; i++) {
                //取出第0行所有列的单元格数据
                cell = row.getCell(i);

                //设置单元格的类型是String类型, 获取单元格的数据
                DataFormatter dataFormatter = new DataFormatter();
                String stringCellValue = dataFormatter.formatCellValue(cell);

                list.add(stringCellValue);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /*
     * 通过输入的excel文件来将每一列的数据封装成list并返回
     * @param inputStream
     * @return java.util.List<java.util.List<java.lang.String>>
     * @author LiYing
     * @creed: Talk is cheap,show me the code
     * @date 2022/4/15 16:06
     */
    public static List<List<String>> excelToData(InputStream inputStream) {
        Workbook workbook = null;
        List<List<String>> list = new ArrayList<>();
        try {
            //根据传递过来的文件输入流创建一个workbook对象（对应Excel中的工作簿）
            workbook = WorkbookFactory.create(inputStream);
            //创建完成，关闭输入流
            inputStream.close();

            //获取工作表对象，即第一个工作表 （工作簿里面有很多张工作表，这里取第一张工作表）
            Sheet sheet = workbook.getSheetAt(0);
            //获取工作表的总行数
            int rowLength = sheet.getLastRowNum() + 1;

            //获取第一行数据
            Row row = sheet.getRow(0);
            //工作表一共有多少列
            int colLength = row.getLastCellNum();
            //创建单元格对象
            Cell cell = null;

            for (int i = 1; i < rowLength; i++) {
                List<String> object = new ArrayList<>();
                for (int j = 0; j < colLength; j++) {
                    //分别取出第 a行 b列的单元格数据
                    cell = sheet.getRow(i).getCell(j);
                    //设置单元格的类型是String类型, 获取单元格的数据
                    DataFormatter dataFormatter = new DataFormatter();
                    String stringCellValue = dataFormatter.formatCellValue(cell);

                    object.add(stringCellValue);
                }
                list.add(object);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}
